package miguel.seriesly;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

import miguel.api.UserMisSeries;
import miguel.objects.Serie;
import miguel.objects.SerieExtendida;
import miguel.utils.DownloadHelper;
import miguel.utils.ManejoSD;
import miguel.utils.SeriesLySQLiteHelper;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;

public class ComprobarNotificaciones extends Service {

	private Timer timer = new Timer();
	private static final long UPDATE_INTERVAL = 30000;
	private NotificationManager mManager;
	private HashMap<String, Serie> hashMapSeriesNuevas;
	private SeriesLySQLiteHelper sqlSeries;
	private final int APP_ID_NOTIFICATION = 1;
	
	
	@Override
	public IBinder onBind(Intent arg0) {
		return null;
	}
	
	@Override
	public void onCreate() {
		super.onCreate();
		
		//Objeto para crear las notificaciones
		mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

		//Creamos una manejador de la base de datos de las series
		sqlSeries = new SeriesLySQLiteHelper(ComprobarNotificaciones.this, "DB_SeriesLy", null, 1);
		
		//Creamos un hashMap que contendrá las series nuevas
		hashMapSeriesNuevas = new HashMap<String, Serie>();
		
		_startService();
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		_shutdownService();
	}
	
	private void _startService() {
		timer.scheduleAtFixedRate(
			new TimerTask() {
				public void run() {
					ejecutarTarea();
				}
			},
			0,
			UPDATE_INTERVAL);
	}
	
	private void _shutdownService() {
		if (timer != null) timer.cancel();
	}
	
	private Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			actualizarSeries(msg);
		}
	};
	
	private void actualizarSeries(Message msg) {
		if(((String)msg.obj).equals("NuevasSeries")) {
			//Si hay nuevas series las cargamos en la base de datos

	        //Iteramos obteniendo las claves
	        Iterator it = hashMapSeriesNuevas.entrySet().iterator();
	        while (it.hasNext()) {
	            Map.Entry e = (Map.Entry)it.next();
	            String clave = e.getKey().toString();
	            SerieExtendida serieGuardar = (SerieExtendida) e.getValue();;
	            
	            //Insertamos la serie en base de datos
	            sqlSeries.insertarSerie(serieGuardar);
	            
	            //Ahora descargamos la imagen
	            Bitmap imagenSerie = new DownloadHelper().getImageBitmap(serieGuardar.getSmall_thumb());
	            //Y la guardamos en la tarjeta externa de memoria del móvil
	            ManejoSD manejoSD = new ManejoSD();
				String urlSmallThumb = serieGuardar.getSmall_thumb();
				String nombreSmallThumb = urlSmallThumb.split("/")[urlSmallThumb.split("/").length - 1];
				manejoSD.guardarImagenes("small_thumb", nombreSmallThumb, imagenSerie);
	        }
		}
	}
	
	public void ejecutarTarea() {
		Serie[] seriesDescargas = UserMisSeries.getMisSeries(ComprobarNotificaciones.this);
		//Descargamos las series del servidor
		SerieExtendida[] series = new SerieExtendida[seriesDescargas.length];
		for(int i=0; i<seriesDescargas.length; i++) {
			series[i] = new SerieExtendida(seriesDescargas[i], 1);
		}
		
		//Cargamos las series que ya tenemos en la base de datos
		SerieExtendida [] seriesBD = sqlSeries.obtenerSeries();
		
		//Cargamos las series de la base de datos en un hashmap
		HashMap<String, Serie> hashMapSeriesBD = new HashMap<String, Serie>();
		for(int i=0; i<seriesBD.length; i++) {
			hashMapSeriesBD.put(seriesBD[i].getIdSerie(), seriesBD[i]);
		}
		
		//Comprobamos si hay una serie nueva, si la hay la añadimos a un hashmap de series nuevas
		hashMapSeriesNuevas = new HashMap<String, Serie>();
		for(int i=0; i<series.length; i++) {
			String idSerieComprobar = series[i].getIdSerie();
			if(!hashMapSeriesBD.containsKey(idSerieComprobar)) {
				hashMapSeriesNuevas.put(idSerieComprobar, series[i]);
			}
		}
		
		if(!hashMapSeriesNuevas.isEmpty()) {
			Message msg = new Message();
			msg.obj = "NuevasSeries";
			handler.sendMessage(msg);
			
			Notificar();
		}
	}
	
	private void Notificar() {
			
		//Prepara la actividad que se abrira cuando el usuario pulse la notificacion
		Intent intentNot = new Intent(this, PantallaCambios.class);
		
		//Prepara la notificacion
		Notification notification = new Notification(R.drawable.icon, getString(R.string.cambiosSeriesLy), System.currentTimeMillis());
		notification.setLatestEventInfo(this, getString(R.string.app_name), getString(R.string.cambiosSeriesLy), 
				PendingIntent.getActivity(this.getBaseContext(), 0, intentNot, PendingIntent.FLAG_CANCEL_CURRENT));
		
		//Le añade sonido
		notification.defaults |= Notification.DEFAULT_SOUND;
		
		//Le añade vibración
		notification.defaults |= Notification.DEFAULT_VIBRATE;
		
		//Le alade luz mediante LED
		notification.defaults |= Notification.DEFAULT_LIGHTS;
		
		//La notificación se detendrá cuando el usuario pulse en ella
		notification.flags = Notification.FLAG_AUTO_CANCEL;
		
		//Lanza la notificación
		mManager.notify(APP_ID_NOTIFICATION, notification);
		
	 }
}
